#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define N 82000
using namespace std;
struct ppp{
int x,y;
double k;
}ans[N];
int n,bo[N],choose[N],sx,sy,i,j,k,s;
pair<int,int> bo2[N];
bool cmp(const ppp&a,const ppp&b){
return a.k<b.k;
}
int main(){
scanf("%d",&n);
for(i=0;i<=200;++i)
for(j=0;j<=200;++j){
bo[i*i+j*j]=1;
bo2[i*i+j*j]=make_pair(i,j);
}
k=n; s=0;
for(i=1;k;++i)if(bo[i])choose[i]=1,s+=i,k--;
if(s&1){
for(;;++i)if(bo[i]){
choose[i]=1;
s+=i;
break;
}
for(;;--i)if(choose[i] && (s&1)==(i&1)){
choose[i]=0;
break;
}
}
sx=sy=0;
for(i=40000;i>=1;--i)if(choose[i]){
int xx=bo2[i].first,yy=bo2[i].second;
for(j=0;j<=1;++j)
for(int px=-1;px<=1;++px)if(px)
for(int py=-1;py<=1;++py)if(py){
int tx=sx+(j?xx*px:yy*px);
int ty=sy+(j?yy*py:xx*py);
if(1ll*tx*tx+1ll*ty*ty<=1ll*xx*xx+1ll*yy*yy){
sx=tx; sy=ty;
ans[++k].x=(j?xx*px:yy*px);
ans[k].y=(j?yy*py:xx*py);
ans[k].k=atan2(ans[k].y,ans[k].x);
goto ff;
}
}
ff:;
}
sort(ans+1,ans+n+1,cmp);
sx=sy=0;
printf("YES\n");
for(i=1;i<=n;++i){
sx+=ans[i].x;
sy+=ans[i].y;
printf("%d %d\n",sx,sy);
}
}
112. Path Sum | 1556A - A Variety of Operations |
136. Single Number | 169. Majority Element |
119. Pascal's Triangle II | 409. Longest Palindrome |
1574A - Regular Bracket Sequences | 1574B - Combinatorics Homework |
1567A - Domino Disaster | 1593A - Elections |
1607A - Linear Keyboard | EQUALCOIN Equal Coins |
XOREQN Xor Equation | MAKEPAL Weird Palindrome Making |
HILLSEQ Hill Sequence | MAXBRIDGE Maximise the bridges |
WLDRPL Wildcard Replacement | 1221. Split a String in Balanced Strings |
1002. Find Common Characters | 1602A - Two Subsequences |
1555A - PizzaForces | 1607B - Odd Grasshopper |
1084A - The Fair Nut and Elevator | 1440B - Sum of Medians |
1032A - Kitchen Utensils | 1501B - Napoleon Cake |
1584B - Coloring Rectangles | 1562B - Scenes From a Memory |
1521A - Nastia and Nearly Good Numbers | 208. Implement Trie |